/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package manejadorConsultas;

import cargarDatos.IteradorDatos;
import cargarDatos.ConexionBD;
//import com.sun.java_cup.internal.runtime.Symbol;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
import javax.swing.table.DefaultTableModel;
import org.jfree.*;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.general.DefaultPieDataset;
/**
 *
 * @author ginancm
 */
public class ConsultasDatamart implements IteradorDatos {
        
    ResultSet rs;
    ConexionBD conexion;
    DefaultPieDataset data;
    
    //Consultas de la estrella MATRICULA
    String query1; // Matriculados por dia
    String query2; // Matriculas por sexo
    String query3; // Promedio asignaturas matriculados por sexo
    //Consultas de la estrella CANCELACIONES
    String query4; // Cancelaciones según estado civil del estudiante
    String query5; // Cancelaciones según estrato socioeconómico del estudiante
    String query6; // Asignaturas canceladas por franja horaria
    //Consultas para tabla agregada MATRICULAXLOCACION
    String query7; //Matriculas por hora en locaciones externas a la U
    String query8; //Matriculas por hora en locaciones internas a la U
    String query9;
    
    public ConsultasDatamart()
    {
        
        //MATRICULA
        query1 = "SELECT u.nombredia, count(*) FROM("
                + "SELECT fecha_k as fecha, nombredia, numerodiasemana FROM "
                + "fecha NATURAL JOIN matricula) "
                + "AS u GROUP BY u.nombredia, u.numerodiasemana ORDER BY u.numerodiasemana;";
        
        query2 = "SELECT sexo, COUNT(*) FROM (("
                + "SELECT estudiante, demografia FROM matricula "
                + "GROUP BY estudiante, demografia ORDER BY estudiante) AS matNoRep "
                + "NATURAL JOIN (SELECT demograficos_k as demografia, sexo FROM"
                + " demograficos ) as demoS) as tmp GROUP BY sexo";
        
        query3 = "SELECT prom.sexo, (sum_no_cursos / no_estud ) as prom_cur_sexo FROM("
                + "(SELECT sexo, COUNT(*) as no_estud FROM ("
                + "(SELECT estudiante, demografia FROM matricula "
                + "GROUP BY estudiante, demografia ORDER BY estudiante) AS matNoRep "
                + "NATURAL JOIN ("
                + "SELECT demograficos_k as demografia, sexo FROM"
                + " demograficos) as demoS) GROUP BY sexo) as est_mat_sexo "
                + "NATURAL JOIN ("
                + "SELECT jon.sexo, SUM(no_cursos) as sum_no_cursos FROM ("
                + "(SELECT estudiante, demografia, count(*) AS no_cursos FROM matricula "
                + "GROUP BY estudiante, demografia ORDER BY estudiante) AS matCountEst "
                + "NATURAL JOIN ("
                + "SELECT demograficos_k as demografia, sexo FROM demograficos) as demogs"
                + ") AS jon GROUP BY jon.sexo) as reg_mat_sexo) as prom";
        
        ///CANCELACIONES
        query4 =  "SELECT estadocivil, COUNT(*) FROM "
                + "((SELECT estudiante, demografia FROM cancelaciones GROUP BY estudiante, "
                + "demografia ORDER BY estudiante) AS matNoRep NATURAL JOIN ("
                + "SELECT demograficos_k as demografia, estadocivil FROM demograficos) as demoS)"
                + " as tmp GROUP BY estadocivil ";
        
        query5 = "SELECT estratosocioe, COUNT(*) FROM (("
                + "SELECT estudiante, demografia FROM cancelaciones "
                + "GROUP BY estudiante, demografia ORDER BY estudiante) AS matNoRep "
                + "NATURAL JOIN (SELECT demograficos_k as demografia, estratosocioe "
                + "FROM demograficos) as demoS) as tmp GROUP BY estratosocioe ORDER BY estratosocioe ASC;";
        
        query6 = "SELECT jon_hora_canc.franja, COUNT (*) AS numCancPorFranja FROM(("
                + "SELECT estudiante,hora FROM cancelaciones GROUP BY estudiante, hora) AS cons1 "
                + "NATURAL JOIN (SELECT hora_k AS hora, franja FROM hora) AS cons2)"
                + " AS jon_hora_canc GROUP BY jon_hora_canc.franja ORDER BY jon_hora_canc.franja ASC;";
        
        //MATRICULAXLOCACION
        query7 = "SELECT hora, count(*) FROM (SELECT numerocursosmatriculados, locacion, hora "
                + "FROM matriculaxlocacion NATURAL JOIN (SELECT locacion_k AS locacion FROM "
                + "locacion WHERE facultad='NO') AS matLocal) AS tmp GROUP BY hora ORDER BY hora ASC;";
        
        query8 = "SELECT hora, count(*) FROM (SELECT numerocursosmatriculados, locacion, hora FROM "
                + "matriculaxlocacion NATURAL JOIN ((SELECT locacion_k AS locacion FROM "
                + "locacion) EXCEPT (SELECT locacion_k AS locacion FROM "
                + "locacion WHERE facultad='NO')) AS matLocal) AS tmp GROUP BY hora ORDER BY hora ASC;";
        
        query9 = "SELECT jornada, count(*) FROM ((SELECT numerocursosmatriculados, locacion, hora "
                + "FROM matriculaxlocacion NATURAL JOIN (SELECT locacion_k AS locacion FROM "
                + "locacion WHERE facultad='NO') AS matLocal) as nummatri NATURAL JOIN "
                + "(SELECT hora_k AS hora, jornada from hora) AS matrijor) AS tmp GROUP BY jornada";
 
    }
    
    public void consultaGeneral(String sql) throws SQLException
    {
         conexion=new ConexionBD("jdbc:postgresql://localhost/DataMartAcademico","postgres","postgres");
         System.out.println("conectado para consulta");
         
         Statement stmt=conexion.conexion.createStatement(
                                       ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
         
         System.out.println("creado statement de conexion");
         
         rs=stmt.executeQuery(String.format(sql));
         
         System.out.println("query ejecutada");
//        throw new UnsupportedOperationException("Not yet implemented");
    }
    
    public void consultaPredefinida(int i) throws SQLException
    {
        int indice;
        
        conexion=new ConexionBD("jdbc:postgresql://localhost/DataMartAcademico","postgres","postgres");
        data =  new DefaultPieDataset();
        indice = i;
        
         Statement stmt=conexion.conexion.createStatement(
                                       ResultSet.TYPE_SCROLL_INSENSITIVE,
                                      ResultSet.CONCUR_UPDATABLE);
         
         
         switch (indice) {
             
             //indices de ejecución de queries en MATRICULA
            case 1:
                rs=stmt.executeQuery(String.format(query1));
                break;
                
            case 2:
                rs=stmt.executeQuery(String.format(query2));
                break;
                
            case 3:
                rs=stmt.executeQuery(String.format(query3));
                break;
              //indices de ejecución de queries en CANCELACIONES  
            case 4:
                rs=stmt.executeQuery(String.format(query4));
                break;
             
            case 5:
                rs=stmt.executeQuery(String.format(query5));
                break;
                
            case 6:
                rs=stmt.executeQuery(String.format(query6));
                break;
             //indices de ejecución de queries en MATRICULAXLOCACION    
            case 7:
                rs=stmt.executeQuery(String.format(query7));
                break;
                
            case 8:
                rs=stmt.executeQuery(String.format(query8));
                break;
                
            case 9:
                rs=stmt.executeQuery(String.format(query9));
                break;
         }
     }

    
    @Override
    public boolean next() throws SQLException{
        return rs.next();
    }

    @Override
    public String getString(int i) throws SQLException {
        return rs.getString(i);
    }

    @Override
    public int getInt(int i) throws SQLException {
        return rs.getInt(i);
    }
    
    public ResultSet getRs(){
        return this.rs;
    }
    public CategoryDataset getRsAsCategoryDataset()
    {
        final DefaultCategoryDataset datos= new DefaultCategoryDataset();
//        int representativo=15;
//        int cont=0;
        try{
            while (rs.next()/*&&cont<representativo*/)
            {
               // Se crea un array que será una de las filas de la tabla.
               datos.addValue(Double.parseDouble(rs.getObject(2)+""), "Cantidad", rs.getObject(1)+"");
//               cont++;
               // Se rellena cada posición del array con una de las columnas de la tabla en base de datos.
//               for (int i=0;i<colNames.length;i++)
//                  fila[i] = rs.getObject(i+1); // El primer indice en rs es el 1, no el cero, por eso se suma 1.
//               fila[0]=rs.getObject(1);
//               fila[1]=rs.getObject(2);
               // Se añade al modelo la fila completa.
//               System.out.println("ResultSet Convertido!!");

            }
            
            rs.beforeFirst();
        }catch(SQLException excp) {
            System.out.println("No se pudo generar gráfica");
        }
        
        return datos;
    }
    public DefaultTableModel getRsAsTableModel(String[] colNames){
        DefaultTableModel obj= null;
        try{
            obj= new DefaultTableModel(colNames, rs.getRow());
            // Recorremos los registros con un ciclo while
            
            while (rs.next())
            {
               // Se crea un array que será una de las filas de la tabla.
               Object [] fila = new Object[colNames.length]; // Hay tres columnas en la tabla

               // Se rellena cada posición del array con una de las columnas de la tabla en base de datos.
               for (int i=0;i<colNames.length;i++)
                  fila[i] = rs.getObject(i+1); // El primer indice en rs es el 1, no el cero, por eso se suma 1.

               // Se añade al modelo la fila completa.
               obj.addRow(fila);
//              System.out.println();
//
//               for(int i=0;i<fila.length;i++)
//               {
//                   System.out.print(fila[i]+",");
//               }
            }
            rs.beforeFirst();
        }
        catch(SQLException excp)
        {
            System.out.println("No pude sacar un Table Model");
        }
        
        
        return obj;
    }
    
          
    public DefaultPieDataset getRsAsPieDataset(){
        
        final DefaultPieDataset datos= new DefaultPieDataset();
//        int representativo=15;
//        int cont=0;
        try{
            while (rs.next() /*&& cont<representativo*/)
            {
               // Se crea un array que será una de las filas de la tabla.
                datos.setValue(rs.getString(1), rs.getDouble(2));
               
               // Se rellena cada posición del array con una de las columnas de la tabla en base de datos.
//               for (int i=0;i<colNames.length;i++)
//                  fila[i] = rs.getObject(i+1); // El primer indice en rs es el 1, no el cero, por eso se suma 1.
//               fila[0]=rs.getObject(1);
//               fila[1]=rs.getObject(2);
               // Se añade al modelo la fila completa.
//                cont++;
//               System.out.println("ResultSet Convertido!!");

            }
            
            rs.beforeFirst();
        }catch(SQLException excp) {
            System.out.println("No se pudo generar gráfica");
        }
        
        return datos;
    }
    
    
}
